• if-then语句,其格式如下:

    1
    2
    3
    4
    if command
    then
    commands
    fi

    bash shell的if语句会运行if后面的那个命令,如果该命令的退出状态码是0(该命令成功运行),位于then部分的命令就会被执行,如果该命令的退出状态码是其他值,then部分的命令就不会执行,bash shell会继续执行脚本中的下一个命令,fi语句表示if-then语句到此结束。举个例子如下:

    1
    2
    3
    4
    5
    #!/bin/bash
    if pwd
    then
    echo "It worked"
    fi
  • 在if-then语句的then部分,可以使用不止一条命令,bash shell会把这些命令当成一个块,如果if语句的命令的退出状态码是0,所有的命令都会被执行,如果if语句的命令的退出状态不为0,所有的命令都会被跳过。

  • if-then-else语句,其格式如下:

    1
    2
    3
    4
    5
    6
    if command
    then
    commands
    else
    commands
    fi

    当if语句的命令中返回的退出状态码是0,then部分的命令会被执行,当if语句中的命令返回非0退出状态码时,bash shell会执行else部分的命令

  • test命令提供了在if-then语句中测试不同条件的途径,如果test命令中列出的条件成立,test命令就会退出并返回状态码0,如果条件不成立,test命令就会退出并返回非零的退出状态码,test命令的格式如下:test condition,结合if-then语句如下:

    1
    2
    3
    4
    if test condition
    then
    commands
    fi

    如果不写test命令的condition部分,它会以非零的退出状态码退出,并执行else语句块:

    1
    2
    3
    4
    5
    6
    7
    #!/bin/bash
    if test
    then
    echo "NO expression returns a True"
    else
    echo "No expression returns a False"
    fi
  • bash shell提供了另一种条件测试方法,无需在if-then语句中声明test命令:

    1
    2
    3
    4
    if [ condition ]
    then
    commands
    fi

    方括号定义了测试条件,需要注意的是第一个方括号之后和第二个方括号之前必须加上一个空格,否则就会报错。

  • test命令可以判断三类条件:
    • 数值比较
    • 字符串比较
    • 文件比较
  • 数值比较

    使用test命令最常见的情形就是对两个数值进行比较,下面列出了测试两个值时可用的条件参数:

    • n1 -eq n2 检查n1是否与n2相等
    • n1 -ge n2 检查n1是否大于或等于n2
    • n1 -gt n2 检查n1是否大于n2
    • n1 -le n2 检查n1是否小于或等于n2
    • n1 -lt n2 检查n1是否小于n2
    • n1 -ne n2 检查n1是否不等于n2

    数值条件测试可以用于数字和变量上

  • 字符串比较
    • str1 = str2 检查str1和str2是否相同
    • str1 != str2 检查str1和str2是否不同
    • str1 < str2 检查str1是否比str2小
    • str1 > str2 检查str1是否比str2大
    • n str1 检查str1的长度是否非0
    • z str1 检查str1的长度是否为0
  • 字符串顺序:当要开始使用测试条件的大于或小于功能时,常常会出现下面两个问题:

    • 大于号和小于号必须转义,否则shell会把它们当作重定向符号,把字符串值当作文件名
    • 大于和小于顺序和sort命令所采用的不同
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/bin/bash
    var1=baseball
    var2=hockey
    if [ var1 > var2 ]
    then
    echo "$var1 is greater than $var2"
    else
    echo "$var1 is less than $var2"
    fi

    在上面这段代码中,脚本把大于号解释成了输出重定向,因此,创建了一个hockey的文件,由于重定向的顺利完成,test命令返回了退出状态码0,要解决这个问题,就需要使用转义大于号:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/bin/bash
    var1=baseball
    var2=hockey
    if [ var1 \> var2 ]
    then
    echo "$var1 is greater than $var2"
    else
    echo "$var1 is less than $var2"
    fi

    看另外一种情况:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/bin/bash
    var1=Testing
    var2=testing
    if [ var1 > var2 ]
    then
    echo "$var1 is greater than $var2"
    else
    echo "$var1 is less than $var2"
    fi

    这个的结果输出是Testing is less than testing,这是为什么呢,这是因为在比较测试时,大写字母会被认为是小于小写字母的,但sort命令恰好相反。比较测试中使用的是标准的ASCII顺序,根据每个字符的ASCII数值来决定排序结果,sort命令使用的是系统的本地化语言设置中定义的排序顺序,对于英语,本地化设置指定了在排序顺序中小写字母出现在大写字母前。

  • 文件比较

    允许你测试Linux文件系统上文件和目录的状态:

    • -d file 检查file是否存在并是一个目录
    • -e file 检查file是否存在
    • -f file 检查file是否存在并是一个文件爱你
    • -r file 检查file是否存在并可读
    • -s file 检查file是否存在并非空
    • -w file 检查file是否存在并可写
    • x file 检查file是否存在并可执行
    • O file 检查file是否存在并属当前用户所有
    • G file 检查file是否存在并且默认组与当前用户相同
    • file1 -nt file2 检查file1是否比file2新
    • file1 -ot file2 检查file1是否比file2旧
  • 双括号命令允许在比较过程中使用高级数学表达式,双括号命令的格式如下:((expression)),expression可以是任意的数学赋值或比较表达式,双括号中表达式的大于号不需要进行转义:

    1
    2
    3
    4
    5
    6
    7
    #!/bin/bash
    var1=10;
    if (($var1 **2 > 90))
    then
    ((var2 = $var1 ** 2))
    echo "The square of var1 is var2"
    fi

    双方括号命令提供了指针字符串比较的高级特性,其格式如下:[[ expression ]],双方括号里的expression使用了test命令中的采用的标准字符串比较,但它提供了另一个特性-模式匹配,例如:

    1
    2
    3
    4
    5
    6
    7
    #!/bin/bash
    if [[ $USER == r* ]]
    then
    echo "Hello $USER"
    else
    echo "Sorry, I do not know you"
    fi
  • case命令:

    1
    2
    3
    4
    5
    case variable in
    pattern1 | pattern2) commands1;;
    pattern3) commands2;;
    *) default commands;;
    esac

    举个例子:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/bin/bash
    case $USER in
    rich | vmuser)
    echo "Welcome, $USER"
    echo "Please enjoy your visit";;
    testing)
    echo "Special testing account";;
    jessica)
    echo "Do not forget to log off when you're done";;
    *)
    echo "Sorry, yuo are not allowed here";;
    esac